// "dev:server": "cross-env NODE_ENV=development node server/server.js",  package.json
const path = require('path');
// const HtmlWebpackPlugin = require('html-webpack-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const webpack = require('webpack')
// const isDev = process.env.NOOE_ENV === 'development'
const VueServerPlugin = require('vue-server-renderer/server-plugin')

module.exports = {
  mode: process.env.NOOE_ENV, // "production" | "development" | "none"
  // Chosen mode tells webpack to use its built-in optimizations accordingly.

  entry: "./client/server-entry.js", // string | object | array
  // Here the application starts executing
  // and webpack starts bundling

  output: {
    // options related to how webpack emits results

    path: path.resolve(__dirname, "server-build"), // string
    // the target directory for all output files
    // must be an absolute path (use the Node.js path module)

    filename: "server-entry.js", // string
    // the filename template for entry chunks

    publicPath: "/", // string
    // the url to the output directory resolved relative to the HTML page

    // library: "MyLibrary", // string,
    // the name of the exported library

    libraryTarget: "commonjs2", // universal module definition
    // the type of the exported library

    /* Advanced output configuration (click to show) */
  },

  module: {
    // configuration regarding modules

    rules: [
      {
        test: /\.(js|jsx|vue)$/,
        loader: 'eslint-loader',
        enforce: 'pre',
        // include: [path.resolve('../client'), path.resolve('../test')],
        exclude: /node_modules/,
        options: {
          formatter: require('eslint-friendly-formatter'),
          // 不符合Eslint规则时只警告(默认运行出错)
          // emitWarning: !config.dev.showEslintErrorsInOverlay
        }
      },
      // rules for modules (configure loaders, parser options, etc.)
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        exclude: [
          path.resolve(__dirname, "node_modules")
        ],
        options: {
          hotReload: true, // 不需要设置
          preserveWhitepace: true, // 去掉template的text的结尾误写的空格
        }
      },
      {
        test: /\.(jsx|js)?$/,
        // include: [
        //   path.resolve(__dirname, "app")
        // ],
        exclude: [
          path.resolve(__dirname, "node_modules")
        ],
        // these are matching conditions, each accepting a regular expression or string
        // test and include have the same behavior, both must be matched
        // exclude must not be matched (takes preferrence over test and include)
        // Best practices:
        // - Use RegExp only in test and for filename matching
        // - Use arrays of absolute paths in include and exclude
        // - Try to avoid exclude and prefer include

        // issuer: { test, include, exclude },
        // conditions for the issuer (the origin of the import)

        // enforce: "pre",
        // enforce: "post",
        // flags to apply these rules, even if they are overridden (advanced option)

        loader: "babel-loader",
        // the loader which should be applied, it'll be resolved relative to the context
        // -loader suffix is no longer optional in webpack2 for clarity reasons
        // see webpack 1 upgrade guide

        // options: {
        //   presets: ["es2015"]
        // },
        // options for the loader
      },

      {
        test: /\.(css|scss)$/,

        use: ExtractTextPlugin.extract({
          fallback: "style-loader",
          use: [{
            loader: "css-loader",
            options: {
              /* ... */
            }
          },
          {
            loader: "sass-loader",
          }]
        })
        // use: [
        //   // apply multiple loaders and options
        //   "style-loader",
        //   {
        //     loader: "css-loader",
        //     options: {
        //       /* ... */
        //     }
        //   },
        //   {
        //     loader: "sass-loader",
        //   }
        // ]
      },

    ],

    /* Advanced module configuration (click to show) */
  },

  resolve: {
    // options for resolving module requests
    // (does not apply to resolving to loaders)

    modules: [
      "node_modules",
      // path.resolve(__dirname, "app")
    ],
    // directories where to look for modules

    extensions: [".js", ".json", ".jsx", ".css", ".vue", ".scss"],
    // extensions that are used

    // alias: {
    //   // a list of module name aliases

    //   // "module": "new-module",
    //   // alias "module" -> "new-module" and "module/path/file" -> "new-module/path/file"

    //   // "only-module$": "new-module",
    //   // alias "only-module" -> "new-module", but not "only-module/path/file" -> "new-module/path/file"

    //   "vue": path.resolve(__dirname, "./node_modules/vue/dist/vue.js"),

    // },
    /* alternative alias syntax (click to show) */

    /* Advanced resolve configuration (click to show) */
  },

  // performance: {
  //   hints: "warning", // enum
  //   maxAssetSize: 200000, // int (in bytes),
  //   maxEntrypointSize: 400000, // int (in bytes)
  //   assetFilter: function(assetFilename) {
  //     // Function predicate that provides asset filenames
  //     return assetFilename.endsWith('.css') || assetFilename.endsWith('.js');
  //   }
  // },

  devtool: "source-map", // enum
  // enhance debugging by adding meta info for the browser devtools
  // source-map most detailed at the expense of build speed.

  // context: __dirname, // string (absolute path!)
  // the home directory for webpack
  // the entry and module.rules.loader option
  //   is resolved relative to this directory

  target: "node", // enum
  // the environment in which the bundle should run
  // changes chunk loading behavior and available modules

  externals: Object.keys(require('./package.json').dependencies),
  // Don't follow/bundle these modules, but request them at runtime from the environment

  // stats: "errors-only",
  // lets you precisely control what bundle information gets displayed

  plugins: [
    // ...
    new ExtractTextPlugin("styles.css"),
    new VueLoaderPlugin(),
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': process.env.NODE_ENV || 'development',
      'process.env.VUE_ENV': 'server',
    }),
    new VueServerPlugin()

  ],
  // list of additional plugins

  /* Advanced configuration (click to show) */
}
